home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 17 / Computer Interactive cdrom 17 - gen 99.iso / ZDNETIT / CONTENT / OPTIVC16.ZIP / INCLUDE.ZIP / VDSTD.H < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-21  |  13.8 KB  |  298 lines

  1. /*  VDstd.h
  2.  
  3.   vector management functions:
  4.   manipulations on whole arrays or vectors of data type "double"
  5.   (real numbers)
  6.  
  7.   Copyright (c) 1996-1998 by Martin Sander
  8.   All Rights Reserved.
  9. */
  10.  
  11. #ifndef __VDSTD_H
  12. #define __VDSTD_H
  13. #if !defined( __VECLIB_H )
  14. #include <VecLib.h>
  15. #endif
  16.  
  17.  
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21.  
  22. /*************************  Generation  **************************/
  23.  
  24. dVector   __vf  VD_vector( ui size );
  25. dVector   __vf  VD_vector0( ui size );
  26.  
  27. /***************  Addressing single vector elements ******************/
  28.  
  29. double _VFAR * VD_Pelement( dVector X, ui n );
  30.       /* returns a pointer to the n'th element of X. For the memory model
  31.          HUGE, the pointer is normalized. */
  32. #define VD_element( X, n )  (*VD_Pelement( X, n ))
  33.  
  34. /*******************  Initialization **********************************/
  35.  
  36. void  __vf  VD_equ0( dVector X, ui size );
  37. void  __vf  VD_equ1( dVector X, ui size );
  38. void  __vf  VD_equC( dVector X, ui size, double C );
  39. void  __vf  VD_equV( dVector Y, dVector X, ui size );
  40. void  __vf  VDx_equV( dVector Y, dVector X, ui size, double A, double B );
  41. void  __vf  VD_ramp( dVector X, ui size, double Start, double Rise );
  42. void  __vf  VD_Parzen( dVector X, ui size );
  43. void  __vf  VD_Welch( dVector X, ui size );
  44. void  __vf  VD_Hanning( dVector X, ui size );
  45. void  __vf  VD_comb( dVector X, ui size, unsigned step, double C );
  46. long  __vf  VD_random( dVector X, ui size, long seed,
  47.                        double MinVal, double MaxVal );
  48. long  __vf  VD_noise( dVector X, ui size, long seed, double Amp );
  49.             /* VD_random and VD_noise return a new seed value.
  50.                random quality of VD_random is much better      */
  51.  
  52.  
  53. /***************  Data-type interconversions  *************************/
  54.        /* for rounding functions, see VDmath.h ! */
  55.  
  56. void  __vf   V_SItoD(  dVector Y, siVector X, ui size );
  57. void  __vf   V_ItoD(   dVector Y, iVector  X, ui size );
  58. void  __vf   V_LItoD(  dVector Y, liVector X, ui size );
  59. void  __vf   V_QItoD(  dVector Y, qiVector X, ui size );
  60.  
  61. void  __vf   V_UStoD(  dVector Y, usVector X, ui size );
  62. void  __vf   V_UtoD(   dVector Y, uVector  X, ui size );
  63. void  __vf   V_ULtoD(  dVector Y, ulVector X, ui size );
  64.  
  65. void  __vf   V_FtoD( dVector Y, fVector X, ui size );
  66. void  __vf   V_DtoF( fVector Y, dVector X, ui size );
  67. #ifdef __BORLANDC__   /* 80-bit IEEE numbers supported */
  68.     void  __vf   V_DtoE( eVector Y, dVector X, ui size );
  69.     void  __vf   V_EtoD( dVector Y, eVector X, ui size );
  70. #else  /* no IEEE number support with Visual C++ */
  71.     #define V_DtoE VD_equV
  72.     #define V_EtoD VD_equV
  73. #endif
  74.  
  75.  
  76. /****************  Index-oriented manipulations ***********************/
  77.  
  78.  
  79. void  __vf  VD_reflect( dVector X, ui size );
  80. void  __vf  VD_rev( dVector Y, dVector X, ui size );
  81. #if defined (V_HUGE)
  82.     void  __vf  VD_rotate( dVector Y, dVector X, ui size, long pos );
  83. #else
  84.     void  __vf  VD_rotate( dVector Y, dVector X, ui size, int pos );
  85. #endif
  86. void  __vf  VD_delete( dVector X, ui size, ui pos );
  87. void  __vf  VD_insert( dVector X, ui size, ui pos, double C );
  88. void  __vf  VD_sort( dVector Y, dVector X, ui size, int dir );
  89. void  __vf  VD_sortind( uiVector Ind, dVector X, ui size, int dir );
  90. void  __vf  VD_subvector( dVector Y, ui sizey, dVector X, int step );
  91. void  __vf  VD_indpick( dVector Y, uiVector Ind, ui sizey, dVector X );
  92. void  __vf  VD_indput(  dVector Y, dVector X, uiVector Ind, ui sizex );
  93. void  __vf  VD_indpick( dVector Y, uiVector Ind, ui size, dVector X );
  94. ui    __vf  VD_searchC( dVector X, ui size, double C, int mode );
  95. void  __vf  VD_searchV( uiVector Ind, dVector X, ui sizex,
  96.                                      dVector Tab, ui sizetab, int mode );
  97.  
  98. void  __vf  VD_polyinterpol( dVector Y, dVector X, ui sizex,
  99.                         dVector XTab, dVector YTab, ui sizetab, unsigned deg );
  100. void  __vf  VD_ratinterpol( dVector Y, dVector X, ui sizex,
  101.                         dVector XTab, dVector YTab, ui sizetab, unsigned deg );
  102. void  __vf  VD_splinederiv2( dVector Y2, dVector XTab, dVector YTab,
  103.                             ui size, int specify, double Yp0, double Ypn );
  104. void  __vf  VD_splineinterpol( dVector Y, dVector X, ui sizex,
  105.                     dVector XTab, dVector YTab, dVector Y2Tab, ui sizetab );
  106.  
  107.  
  108. /***************** Functions of a sub-set of elements  ********************/
  109.  
  110. void  __vf  VD_subvector_equC(  dVector Y, ui subsiz, unsigned samp, double C );
  111. void  __vf  VD_subvector_equV(  dVector Y, ui subsiz, unsigned samp, dVector X );
  112.     /*   for arithmetic functions of subsets, see <VDmath.h>  */
  113.  
  114. /**************** One-Dimensional Vector Operations ***********************/
  115.  
  116. double     __vf  VD_max( dVector X, ui size );
  117. double     __vf  VD_min( dVector X, ui size );
  118. double     __vf  VD_absmax( dVector X, ui size );
  119. double     __vf  VD_absmin( dVector X, ui size );
  120. double     __vf  VD_maxind( ui _VFAR *Ind, dVector X, ui size );
  121. double     __vf  VD_minind( ui _VFAR *Ind, dVector X, ui size );
  122. double     __vf  VD_absmaxind( ui _VFAR *Ind, dVector X, ui size );
  123. double     __vf  VD_absminind( ui _VFAR *Ind, dVector X, ui size );
  124. ui         __vf  VD_localmaxima( uiVector Ind, dVector X, ui size );
  125. ui         __vf  VD_localminima( uiVector Ind, dVector X, ui size );
  126. void       __vf  VD_runmax( dVector Y, dVector X, ui size );
  127. void       __vf  VD_runmin( dVector Y, dVector X, ui size );
  128. double     __vf  VD_sum( dVector X, ui size );
  129. double     __vf  VD_prod( dVector X, ui size );
  130. void       __vf  VD_runsum( dVector Y, dVector X, ui size );
  131. void       __vf  VD_runprod( dVector Y, dVector X, ui size );
  132. int        __vf  VD_iselementC( dVector Tab, ui size, double C );
  133. ui         __vf  VD_iselementV( dVector Y, dVector X, ui sizex,
  134.                                 dVector Tab, ui sizetab );
  135.  
  136. /**************** Statistical Functions and Building Blocks *************/
  137.  
  138. double  __vf  VD_sumabs( dVector X, ui size );
  139. double  __vf  VD_mean( dVector X, ui size );
  140. double  __vf  VD_meanwW( dVector X, dVector Wt, ui size );
  141. double  __vf  VD_meanabs( dVector X, ui size );
  142. double  __vf  VD_selected_mean( ui _VFAR *nsel, dVector X, ui size,
  143.                  double XMin, double XMax ); /* takes only x with Min<=x<=Max */
  144. double  __vf  VD_median( dVector X, ui size );
  145. double  __vf  VD_sumdevC( dVector X, ui size, double C );
  146. double  __vf  VD_sumdevV( dVector X, dVector Y, ui size );
  147. double  __vf  VD_avdevC( dVector X, ui size, double C );
  148. double  __vf  VD_avdevV( dVector X, dVector Y, ui size );
  149. double  __vf  VD_ssq( dVector X, ui size );  /* sum-of-squares */
  150. double  __vf  VD_rms( dVector X, ui size );  /* root of the mean square */
  151. double  __vf  VD_ssqdevC( dVector X, ui size, double C );
  152. double  __vf  VD_ssqdevV( dVector X, dVector Y, ui size );
  153. double  __vf  VD_meanvar( double _VFAR *Var, dVector X, ui size );
  154. double  __vf  VD_meanvarwW( double _VFAR *Var, dVector X, dVector Wt, ui size );
  155. double  __vf  VD_varianceC( dVector X, ui size, double C );
  156. double  __vf  VD_varianceV( dVector X, dVector Y, ui size );
  157. double  __vf  VD_varianceCwW( dVector X, dVector Wt, ui size, double C );
  158. double  __vf  VD_varianceVwW( dVector X, dVector Y, dVector Wt, ui size );
  159. double  __vf  VD_chi2( dVector X, dVector Y, dVector InvVar, ui size );
  160. double  __vf  VD_chiabs( dVector X, dVector Y, dVector Wt, ui size );
  161. double  __vf  VD_corrcoeff( dVector X, dVector Y, ui size,
  162.                             double Xmean, double Ymean );
  163. ui    __vf  VD_distribution( uiVector Abund, dVector Limits, ui nbins,
  164.                              dVector X, ui sizex, int mode );
  165.  
  166. void  __vf  VD_linregress( dVector Param, dVector X, dVector Y, ui size );
  167. void  __vf  VD_linregresswW( dVector Param, dVector X, dVector Y,
  168.                              dVector InvVar, ui size );
  169.      /* more linear and nonlinear data fitting routines need MatrixLib
  170.         and are declared in <MDstd.h> !                                */
  171.  
  172.  
  173. /*********  Fourier Transforms, Convolutions, Filtering  ****************/
  174.  
  175. void      __vf   VD_setRspEdit( dComplex Trunc );
  176. dComplex  __vf   VD_getRspEdit( void );
  177. void  __vf   VDl_FFT( dVector Y, dVector X, ui size, int dir );
  178. void  __vf   VDl_filter( dVector Y, dVector X, dVector Flt, ui size );
  179. void  __vf   VDl_autocorr( dVector Y, dVector X, ui size );
  180. void  __vf   VDl_xcorr( dVector Z, dVector X, dVector Y, ui size );
  181. double __vf  VDl_spectrum( dVector Spc, ui specsiz, dVector X, ui xsiz,
  182.                            dVector Win );
  183.                            /* xsiz >= n*specsiz,  Winsiz = 2*specsiz ! */
  184. void  __vf   VDl_convolve( dVector Y, dVector Flt, dVector X,
  185.                            dVector Rsp, ui size );
  186. void  __vf   VDl_deconvolve( dVector Y, dVector Flt, dVector X,
  187.                              dVector Rsp, ui size );
  188.  
  189. void  __vf   VDs_FFT( dVector Y, dVector X, ui size, int dir );
  190. void  __vf   VDs_filter( dVector Y, dVector X, dVector Flt, ui size );
  191. void  __vf   VDs_autocorr( dVector Y, dVector X, ui size );
  192. void  __vf   VDs_xcorr( dVector Z, dVector X, dVector Y, ui size );
  193. double __vf  VDs_spectrum( dVector Spc, ui specsiz, dVector X, ui xsiz,
  194.                            dVector Win );
  195. void  __vf   VDs_convolve( dVector Y, dVector Flt, dVector X,
  196.                            dVector Rsp, ui size );
  197. void  __vf   VDs_deconvolve( dVector Y, dVector Flt, dVector X,
  198.                              dVector Rsp, ui size );
  199.  
  200. #if( defined( __LARGE__ ) || defined( __COMPACT__ ) )
  201.    #define VD_FFT         VDl_FFT
  202.    #define VD_convolve    VDl_convolve
  203.    #define VD_deconvolve  VDl_deconvolve
  204.    #define VD_filter      VDl_filter
  205.    #define VD_autocorr    VDl_autocorr
  206.    #define VD_xcorr       VDl_xcorr
  207.    #define VD_spectrum    VDl_spectrum
  208. #else
  209.    #define VD_FFT         VDs_FFT
  210.    #define VD_convolve    VDs_convolve
  211.    #define VD_deconvolve  VDs_deconvolve
  212.    #define VD_filter      VDs_filter
  213.    #define VD_autocorr    VDs_autocorr
  214.    #define VD_xcorr       VDs_xcorr
  215.    #define VD_spectrum    VDs_spectrum
  216. #endif
  217.  
  218.  
  219. /********************** Analysis ****************************************/
  220.  
  221. void    __vf  VD_derivC( dVector Y, dVector X, ui size, double Deltat );
  222. void    __vf  VD_derivV( dVector Z, dVector X, dVector Y, ui size );
  223. double  __vf  VD_integralC( dVector X, ui size, double Deltat );
  224. void    __vf  VD_runintegralC( dVector Y, dVector X, ui size, double Deltat );
  225. double  __vf  VD_integralV( dVector X, dVector Y, ui size );
  226. void    __vf  VD_runintegralV( dVector Z, dVector X, dVector Y, ui size );
  227. void    __vf  VD_smooth( dVector Y, dVector X, ui size, unsigned deg );
  228. int     __vf  VD_ismonoton( dVector X, ui size );
  229.  
  230. /****************** Geometrical Vector Arithmetics **************************/
  231.  
  232. double    __vf  VD_scalprod( dVector X, dVector Y, ui size );
  233. void      __vf  VD_xprod( dVector Z, dVector X, dVector Y );
  234. double    __vf  VD_Euclid( dVector X, ui size );
  235.  
  236.  
  237. /***************************  Input and Output *****************************/
  238.  
  239. void  __vf    VD_fprint( FILE _VFAR *stream, dVector X, ui size, unsigned nperline, unsigned linewidth );
  240. #if !(defined _Windows || defined _WINDOWS)
  241.    void  __vf    VD_cprint( dVector X, ui size, unsigned nperline );
  242. #endif
  243. #define       VD_print( x, sz, npl )  VD_fprint( stdout, x, sz, npl, 80 )
  244.          /*  VD_print is usable only for DOS and EasyWin applications! */
  245. void  __vf    VD_write( FILE _VFAR *stream, dVector X, ui size  ); /* in ascii */
  246. void  __vf    VD_read( dVector X, ui size, FILE _VFAR *stream );
  247. void  __vf    VD_nwrite( FILE _VFAR *stream, unsigned n, ui size, ... );
  248. void  __vf    VD_nread( unsigned n, ui size, FILE _VFAR *stream, ... );
  249. void  __vf    VD_setWriteFormat( char _VFAR *FormatString );
  250.                                             /* for VD_write and VD_nwrite */
  251. void  __vf    VD_setWriteSeparate( char _VFAR *SepString ); /* for VD_write */
  252. void  __vf    VD_setNWriteSeparate( char _VFAR *SepString ); /* for VD_nwrite */
  253. #ifdef V_HUGE
  254.     void  __vf    VD_store( FILE _VFAR *stream, dVector X, ui size );
  255.     void  __vf    VD_recall( dVector X, ui size, FILE _VFAR *stream  );
  256. #else
  257.     #ifdef __cplusplus
  258.          void  inline VD_store( FILE _VFAR *stream, dVector X, ui size )
  259.          {    fwrite( X, sizeof(double), size, stream ); 
  260.          }
  261.          void  inline VD_recall( dVector X, ui size, FILE _VFAR *stream )
  262.          {    fread(  X, sizeof(double), size, stream );
  263.          }
  264.     #else
  265.         #define VD_store( str, X, sz )  \
  266.                      fwrite( X, sizeof(double), sz, str )
  267.         #define VD_recall( X, sz, str ) \
  268.                      fread(  X, sizeof(double), sz, str )
  269.     #endif
  270. #endif      /* VD_store, VD_recall in binary format */
  271.  
  272. #ifdef __cplusplus
  273. }    //  end of extern "C"
  274.          // alternative syntax of convolution and deconvolution:
  275.     inline void VDl_convolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  276.                               ui size, double TruncRe, double TruncIm )
  277.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  278.         VDl_convolve( Y, Flt, X, Rsp, size );
  279.     }
  280.     inline void VDl_deconvolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  281.                                 ui size, double TruncRe, double TruncIm )
  282.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  283.         VDl_deconvolve( Y, Flt, X, Rsp, size );
  284.     }
  285.     inline void VDs_convolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  286.                               ui size, double TruncRe, double TruncIm )
  287.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  288.         VDs_convolve( Y, Flt, X, Rsp, size );
  289.     }
  290.     inline void VDs_deconvolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  291.                                 ui size, double TruncRe, double TruncIm )
  292.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  293.         VDs_deconvolve( Y, Flt, X, Rsp, size );
  294.     }
  295. #endif   /*  __cplusplus   */
  296.  
  297. #endif   /*  __VDSTD_H  */
  298.